#include <iostream>
#include <string>

#if 0
    // 用继承（好处就是很多现成的函数拿过来就能用）
    class MyString:public std::string
    {
    public:
        MyString(const char *str):std::string(str){}
    };

    int main()
    {
        MyString s = "hello";
        s += "world";
        std::cout<<s<<std::endl;
        return 0;
    }
#endif

#if 1
    // 用组合（把对象封在里面，所有接口得自己重写一遍，好处是代码更清晰，逻辑更通顺，封装性做的好）
    class MyString
    {
    public:
        MyString(const char *str):str(str){}
    
    private:
        std::string str;
    };

    int main()
    {
        MyString s = "hello";
        s += "world";
        std::cout<<s<<std::endl;
        return 0;
    }
#endif
// 实际开发中，组合会用，继承也会用，但多继承少用，各有优缺点，要融合着使用